﻿
using System;
using System.Collections;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Xml;
using System.Xml.Linq;
using Iesi.Collections;
using Iesi.Collections.Generic;
using Metodesa.Logic;
using METODESA.Server.Data.Exceptions;
using METODESA.Server.Data.METODESA.Entity;
using METODESA.Server.Data.METODESA.Factorys;
using METODESA.Server.Data.METODESA.Nhibernate;
using Metodesa.Tools;
using NHibernate;
using NHibernate.Mapping;
using NHibernate.Transaction;

namespace Metodesa.Views.Home
{
    public partial class ListProveedor : System.Web.UI.Page
    {
        public HtmlTable tableProveedor;


        // Variable que me indica si he cargado las validaciones y los mensajes
        public static bool loaded = false; 

        protected void Page_Load(object sender, EventArgs e)
        {

            if (validatorTelefono1.ValidationExpression.Equals(""))
            {
                loadExpressions();
            }
            if (validatorTelefono1.ErrorMessage.Equals(""))
            {
                loadMessages();
            }

                
            
            label.Visible = false;
            ListProveedores.Visible = false;
            PanelAddProveedor.Visible = false;
            PanelEditProveedor.Visible = false;
            if (Session["User"] != null)
            {
                Empleado usuario = (Empleado)Session["User"];
            }
            else
            {
                Response.Redirect("../../Views/Home/Index.aspx", true);
            }

            int ids = -1;


            String action = Request.QueryString.Get("a");
            if (action != null)
            {

                if (action.Equals("s")) // Select for update
                {
                    prepareDetailsUpdate();  //Preparo el panel para hacer Update
                }

                else if (action.Equals("d"))
                {
                    // DELETE

                    ids = int.Parse(Request.QueryString.Get("id"));
                    
                    ProveedorLogic.delete(ids);
                    
                    label.Visible = true;
                    label.ForeColor = Color.Blue;
                    label.Text = "Proveedor eliminado satifactoriamente";
                }
            }
            else
                PanelEditProveedor.Visible = false;
 
        }

        /// <summary>
        /// Procedimiento para cargar los mensajes de error desde XML
        /// </summary>
        private void loadMessages()
        {
            XmlDocument xDoc = new XmlDocument();
            string path = Path.Combine(Server.MapPath("~"), @"Messages.xml");
            xDoc.Load(path);

            XmlNodeList lista = xDoc.GetElementsByTagName("message");
            foreach (XmlElement element in lista)
            {
                if (element.GetAttribute("name").Equals("requeridoNombre"))
                {
                    RequiredFieldNombre.ErrorMessage = element.GetAttribute("error");
                    RequiredFieldNombre1.ErrorMessage = element.GetAttribute("error");

                }
                
                else if (element.GetAttribute("name").Equals("requeridoCedula"))
                {
                    RequiredFieldCedula.ErrorMessage = element.GetAttribute("error");
                    RequiredFieldCedula2.ErrorMessage = element.GetAttribute("error");

                }
                else if (element.GetAttribute("name").Equals("requeridoCedula"))
                {
                    RequiredFieldCedula.ErrorMessage = element.GetAttribute("error");
                    RequiredFieldCedula2.ErrorMessage = element.GetAttribute("error");

                }
                else if (element.GetAttribute("name").Equals("formatoTelefono"))
                {

                    validatorTelefono1.ErrorMessage = element.GetAttribute("error");
                    validatorTelefono2.ErrorMessage = element.GetAttribute("error");
                    validatorTelefono3.ErrorMessage = element.GetAttribute("error");
                    validatorTelefono4.ErrorMessage = element.GetAttribute("error");
                    validatorTelefono5.ErrorMessage = element.GetAttribute("error");
                    validatorTelefono6.ErrorMessage = element.GetAttribute("error");
                    

                }

            }

            loaded = true;
        }
        
        
        /// <summary>
        /// Procedimiento para cargar las expresiones regulares desde el XML
        /// </summary>
        private void loadExpressions()
        {
           
            XmlDocument xDoc = new XmlDocument();
            string path = Path.Combine(Server.MapPath("~"), @"Validations.xml");
            xDoc.Load(path);

            XmlNodeList lista = xDoc.GetElementsByTagName("validation");
            foreach (XmlElement element in lista)
            {
                if (element.GetAttribute("name").Equals("telefono"))
                {
                    string expression = element.GetAttribute("expression");
                    validatorTelefono1.ValidationExpression = expression;
                    validatorTelefono2.ValidationExpression = expression;
                    validatorTelefono3.ValidationExpression = expression;
                    validatorTelefono4.ValidationExpression = expression;
                    validatorTelefono5.ValidationExpression = expression;
                    validatorTelefono6.ValidationExpression = expression;
                    break;
                }
            }

        }

        /// <summary>
        /// Procedimiento para Preparar el panel de detalles para hacer el update
        /// Hace el panel visible y setea los valores que tiene actualmente la entidad
        /// </summary>
        private void prepareDetailsUpdate() 
        {
            int ids;
            PanelAddProveedor.Visible = false;
            PanelEditProveedor.Visible = true; // Hacer Visible el panel de detalles
            ids = int.Parse(Request.QueryString.Get("id"));
            Proveedor proveedor = ProveedorDao.getProveedorById(ids); // Busco el empleado seleccionado
            teId.Text = ids.ToString();
            teName.Text = proveedor.Nombre;// Asigno todos los textBox los valores q tiene el proveedor
                        
            teCi.Text = proveedor.CedulaRif;
            teAddress.Text = proveedor.Direccion;
           
            if(proveedor.telefono.Count>0)
            {
                 IEnumerator a = proveedor.telefono.GetEnumerator();
                 if (a.MoveNext())
                 {
                     Telefono tel = (Telefono) a.Current;
                     teTel1.Text = tel.Numero.ToString();
                     if (proveedor.telefono.Count > 1)
                     {
                         a.MoveNext();
                         tel = (Telefono)a.Current;
                         teTel2.Text = tel.Numero.ToString();
                         if (proveedor.telefono.Count > 2)
                         {
                             a.MoveNext();
                             tel = (Telefono)a.Current;
                             teTel3.Text = tel.Numero.ToString();


                         }


                     }
                 }
               


            }
        }
        /// <summary>
        /// Procedimiento para preparar el panel para agregar
        /// hace el panel visible y setea los campos en vacio
        /// </summary>
        private void prepareDetailsAdd()
        {
            PanelAddProveedor.Visible = true;
            PanelEditProveedor.Visible = false;
            taName.Text = "";
            taTel1.Text= "";
            taTel2.Text = "";
            taTel3.Text = "";
            taCi.Text = "";


        }

        /// <summary>
        /// Procedimiento para editar el proveedor
        /// </summary>
        private void EditProveedor()
        {
            PanelEditProveedor.Visible = false;
            PanelAddProveedor.Visible = false;
            Proveedor proveedor = ProveedorDao.getProveedorById(int.Parse(teId.Text));
           
            proveedor.Nombre = teName.Text;
            proveedor.CedulaRif = teCi.Text;
            proveedor.Direccion = teAddress.Text;
            IEnumerator enumerator = proveedor.telefono.GetEnumerator();
           
            if(!teTel1.Text.Equals(""))
            {
                enumerator.MoveNext();
                ((Telefono) enumerator.Current).Numero = teTel1.Text;
            }if(!teTel2.Text.Equals(""))
            {
                enumerator.MoveNext();
                ((Telefono) enumerator.Current).Numero = teTel2.Text;
            }if(!teTel3.Text.Equals(""))
            {
                enumerator.MoveNext();
                ((Telefono) enumerator.Current).Numero = teTel3.Text;
            }

            try
            {
                ProveedorLogic.update(proveedor);
                label.Visible = true;
                label.ForeColor = Color.Blue;
                label.Text = "Proveedor mofificado satifactoriamente";
            }
            catch (EntityCouldntBeUpdated exception)
            {
                Session.Add("Error", exception);
                label.Visible = true;
                label.ForeColor = Color.Red;
                label.Text = "El proveedor no se pudo agregar";

            }
            catch (Exception exception)
            {
                Session.Add("Error", exception);
                Response.Redirect("../../Views/Home/Error.aspx", true);
            }
            

        }


        /// <summary>
        /// Procedimiento para agregar un proveedor, llamado desde la accion del botton de Agregar
        /// </summary>
        private void AddProveedor()
        {
            PanelAddProveedor.Visible = false;
            PanelEditProveedor.Visible = false;
            
            
            Proveedor proveedor = FactoryProveedor.getProveedor(taCi.Text,taAddress.Text,taName.Text);
            proveedor.telefono = new HashedSet<Telefono>();
            if (taTel1.Text.Equals(""))
            {
                taTel1.Text = " ";
            }
            if (taTel2.Text.Equals(""))
            {
                taTel2.Text = " ";
            }
            if (taTel3.Text.Equals(""))
            {
                taTel3.Text = " ";
            }
            
            proveedor.telefono.Add(FactoryTelefono.getTelefono(null, taTel1.Text, proveedor));
            proveedor.telefono.Add(FactoryTelefono.getTelefono(null, taTel2.Text, proveedor));
            proveedor.telefono.Add(FactoryTelefono.getTelefono(null, taTel3.Text, proveedor));

            try
            {

                ProveedorLogic.add(proveedor);
                label.Visible = true;
                label.ForeColor = Color.Blue;
                label.Text = "Proveedor agregado satifactoriamente";
            }
            catch (EntityCouldntBeSaved exception)
            {
                Session.Add("Error", exception);
                label.Visible = true;
                label.ForeColor = Color.Red;
                label.Text = "El proveedor no se pudo agregar";
                
            }
            catch (Exception exception)
            {
                Session.Add("Error", exception);
                Response.Redirect("../../Views/Home/Error.aspx", true);
            }

        }

        protected void AddButton_Click(object sender, EventArgs e)
        {
            AddProveedor();
        }

        protected void EditButton_Click(object sender, EventArgs e)
        {
            EditProveedor();
        }

        protected void PrepareAddButton_Click(object sender, EventArgs e)
        {
            prepareDetailsAdd();
        }

        protected void FindButton_Click(object sender, EventArgs e)
        {

            IList<Proveedor> lista;
            if (option != null && option.SelectedItem != null)
                lista = ProveedorLogic.processSearch(searchbox.Text, option.SelectedValue);
            else
                lista = ProveedorLogic.processSearch(searchbox.Text, "");

            HtmlTable table = ProveedorTools.ListProveedor(lista);


            if (table != null)
            {
                ListProveedores.Controls.Add(table);
                ListProveedores.Visible = true;
            }
            else
            {
                label.Visible = true;
                label.ForeColor = Color.DarkRed;
                label.Text = "No se encontraron proveedores que cumplan con la búsqueda";
            }

        }
    }
}


